package com.horizon.cloud.standard.filter;

import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 一、概述
 * 我们都知道Filter是属于Servlet，用于请求过滤的，通常用于过滤请求的URL，不需要进行安全验证的URL直接通过。而OncePerRequestFilter我们可能不太熟悉，该Filter从字面上理解：只执行一次的Filter。可能有人会问了，我们自己写的Filter不都只执行一次吗？为何Spring还要专门提供这么一个类来处理呢？
 *
 * 二、OncePerRequestFilter更加稳妥
 * 通常 serlvet版本的不同会略有差异。如：servlet2.3与servlet2.4也有一定差异：
 *
 * 在servlet2.3中，Filter会经过一切请求，包括服务器内部使用的forward转发请求和<%@ include file=”/login.jsp”%>的情况
 *
 * servlet2.4中的Filter默认情况下只过滤外部提交的请求，forward和include这些内部转发都不会被过滤，
 *
 * 因此此处我有个建议：我们若是在Spring环境下使用Filter的话，个人建议继承OncePerRequestFilter吧，而不是直接实现Filter接口。这是一个比较稳妥的选择。
 */
public class OptionsRequestFilter extends OncePerRequestFilter
{

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException
    {
        //容许跨域的方法之一
        // response.setHeader("Access-Control-Allow-Origin", "*");
        //容许跨域的方法之二
        //解决办法通过获取Origin请求头来动态设置
        if (null == response.getHeader("Access-Control-Allow-Origin"))
        {

            String origin = request.getHeader("Origin");
            if (!StringUtils.isEmpty(origin))
            {
                response.addHeader("Access-Control-Allow-Origin", origin);
            }else
            {
                response.setHeader("Access-Control-Allow-Origin", "*");
            }

        }

        if (null == response.getHeader("Access-Control-Allow-Methods"))
        {
            response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS,HEAD,DELETE");

        }
        if (null == response.getHeader("Access-Control-Max-Age"))
        {
            response.setHeader("Access-Control-Max-Age", "3600");
        }

        if (null == response.getHeader("Access-Control-Allow-Credentials"))
        {
            response.setHeader("Access-Control-Allow-Credentials", "true");

        }
        if (null == response.getHeader("Access-Control-Allow-Headers"))
        {
            response.setHeader("Access-Control-Allow-Headers",
                    "Content-Type,x-requested-with,X-Custom-Header,Authorization,token,backend");
        }
        if (request.getMethod().equals("OPTIONS"))
        {
            return;
        }


        filterChain.doFilter(request, response);
    }

}
